home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / language / gemfsc18.lzh / AESSRC18.LZH / AESFUNCS / FRMDSDIA.C < prev    next >
C/C++ Source or Header  |  1992-04-06  |  11KB  |  274 lines

  1. /**************************************************************************
  2.  * FRMDSDIA.C - frm_dsdialog(): dynamic string dialog routine.
  3.  *************************************************************************/
  4.  
  5. #include "gemfast.h"
  6. #include "frmtypes.h"
  7.  
  8. #ifndef NULL
  9.   #define NULL 0L
  10. #endif
  11.  
  12. #ifndef TRUE
  13.   #define TRUE  1
  14.   #define FALSE 0
  15. #endif
  16.  
  17. static char *default_buttons[] = {" Continue ",     NULL};
  18. static char *default_strings[] = {"<no message>",   NULL};
  19.  
  20. /*-------------------------------------------------------------------------
  21.  * Object tree for dynamic dialog box...
  22.  *-----------------------------------------------------------------------*/
  23.  
  24. #define OUTLINED_BOX_SPEC 0x00021100L
  25. #define SHADOWED_BOX_SPEC 0x00FF1100L
  26.  
  27. static OBJECT dialtree[] = {
  28.   -1,  1, 21, G_BOX,    NONE,   OUTLINED, 0x00021100L,0x0000, 0x0000, 0x0021, 0x0017,
  29.    2, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x0001, 0x0001, 0x0001,
  30.    3, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x0002, 0x0001, 0x0001,
  31.    4, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x0003, 0x0001, 0x0001,
  32.    5, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x0004, 0x0001, 0x0001,
  33.    6, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x0005, 0x0001, 0x0001,
  34.    7, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x0006, 0x0001, 0x0001,
  35.    8, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x0007, 0x0001, 0x0001,
  36.    9, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x0008, 0x0001, 0x0001,
  37.   10, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x0009, 0x0001, 0x0001,
  38.   11, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x000A, 0x0001, 0x0001,
  39.   12, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x000B, 0x0001, 0x0001,
  40.   13, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x000C, 0x0001, 0x0001,
  41.   14, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x000D, 0x0001, 0x0001,
  42.   15, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x000E, 0x0001, 0x0001,
  43.   16, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x000F, 0x0001, 0x0001,
  44.   17, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x0010, 0x0001, 0x0001,
  45.   18, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x0011, 0x0001, 0x0001,
  46.   19, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x0012, 0x0001, 0x0001,
  47.   20, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x0013, 0x0001, 0x0001,
  48.   21, -1, -1, G_STRING, NONE,   NORMAL,   0L,         0x0001, 0x0014, 0x0001, 0x0001,
  49.    0, 22, 26, G_IBOX,   NONE,   NORMAL,   0x00001100L,0x0001, 0x0015, 0x0001, 0x0001,
  50.   23, -1, -1, G_BUTTON, 0x0005, NORMAL,   0L,         0x0000, 0x0000, 0x0001, 0x0001,
  51.   24, -1, -1, G_BUTTON, 0x0005, NORMAL,   0L,         0x0000, 0x0000, 0x0001, 0x0001,
  52.   25, -1, -1, G_BUTTON, 0x0005, NORMAL,   0L,         0x0000, 0x0000, 0x0001, 0x0001,
  53.   26, -1, -1, G_BUTTON, 0x0005, NORMAL,   0L,         0x0000, 0x0000, 0x0001, 0x0001,
  54.   21, -1, -1, G_BUTTON, 0x0025, NORMAL,   0L,         0x0000, 0x0000, 0x0001, 0x0001
  55.   };
  56.  
  57. #define DIALSTL1 1      /* String Line 1                */
  58. #define DIALPBXB 21     /* Parent Box for exit buttons  */
  59. #define DIALBX01 22     /* First exit button            */
  60.  
  61. /*----------------------------------------------------------------------------
  62.  * count_strings - Count strings and keep track of the longest one.
  63.  *--------------------------------------------------------------------------*/
  64.  
  65. static int count_strings(pstrings, maxstrings, pmaxlen)
  66.     register char   **pstrings;
  67.     register int    maxstrings;
  68.     int             *pmaxlen;
  69. {
  70.     register int    numstrings;
  71.     register int    wrklen;
  72.     register int    maxlen;
  73.  
  74.     for (numstrings = 0, maxlen = 0;
  75.          numstrings < maxstrings && *pstrings && **pstrings != 0x00;
  76.          ++numstrings,
  77.          ++pstrings) {
  78.  
  79.             if (maxlen < (wrklen = strlen(*pstrings))) {
  80.                 maxlen = wrklen;
  81.             }
  82.     }
  83.  
  84.     *pmaxlen = maxlen;
  85.     return numstrings;
  86. }
  87.  
  88. /**************************************************************************
  89.  * frm_dsdial - Form dynamic string dialog.
  90.  *************************************************************************/
  91.  
  92. int frm_dsdialog(options, pbuttons, pstrings)
  93.     long             options;
  94.     char             *pbuttons[];
  95.     char             *pstrings[];
  96. {
  97.     int              dmy;
  98.     int              xbwidth;
  99.     int              slen;
  100.     register int     sizechar;
  101.     register int     counter;
  102.     register int     numobs;
  103.     register int     pixlen;
  104.     register OBJECT  *ptree;
  105.     register char    **pwrk;
  106.     static   int     initdone = 0;
  107.     static   int     l1_title_y;
  108.     static   int     l1_notitle_y;
  109.  
  110. /*-------------------------------------------------------------------------
  111.  * validate the parameters.
  112.  *-----------------------------------------------------------------------*/
  113.  
  114.     if (pstrings == NULL) {
  115.         pstrings = default_strings;
  116.     }
  117.  
  118.     if (pbuttons == NULL) {
  119.         pbuttons = default_buttons;
  120.     }
  121.  
  122.     if (!(options & FRM_NODEFAULTS)) {
  123.         options |= (_FrmDefaults & FRM_DOPTIONBITS) | FRM_DEFAULT_DYNOPT;
  124.     }
  125.     options |= FRM_MANDATORY_DYNOPT;
  126.  
  127. /*-------------------------------------------------------------------------
  128.  * Init the xywh values in the object tree, get the system character sizes
  129.  * for later usage, precalc possible top-line Y placements for later.
  130.  *-----------------------------------------------------------------------*/
  131.  
  132.     if (!initdone) {
  133.         initdone = TRUE;
  134.         rsc_treefix(dialtree);
  135.         l1_notitle_y = dialtree[DIALSTL1].ob_y;
  136.         l1_title_y   = l1_notitle_y - (gl_hchar >> 1);
  137.     }
  138.  
  139. /*-------------------------------------------------------------------------
  140.  * Count the button strings, find the longest one, distribute the buttons
  141.  * evenly within their parent box, make the rightmost the default button.
  142.  * (We place a gutter of 2 character widths on each side of each button.)
  143.  *-----------------------------------------------------------------------*/
  144.  
  145.     {
  146.         register int obx;
  147.  
  148.         numobs = count_strings(pbuttons, FRM_DSMAXBUTTONS, &slen);
  149.  
  150.         sizechar  = gl_wchar;
  151.         pixlen    = (slen + 2) * sizechar;
  152.         sizechar *= 2;
  153.         xbwidth   = (numobs * pixlen) + ((numobs + 1) * sizechar);
  154.  
  155.         for (counter = 0, obx = sizechar, pwrk = pbuttons, ptree = &dialtree[DIALBX01];
  156.              counter < FRM_DSMAXBUTTONS;
  157.              ++counter, obx += pixlen + sizechar, ++ptree) {
  158.  
  159.             ptree->ob_flags &= ~DEFAULT;
  160.  
  161.             if (counter < numobs) {
  162.                 ptree->ob_flags &= ~HIDETREE;
  163.                 ptree->ob_x     = obx;
  164.                 ptree->ob_spec  = (long)*pwrk++;
  165.                 ptree->ob_width = pixlen;
  166.             } else {
  167.                 ptree->ob_flags |= HIDETREE;
  168.             }
  169.         }
  170.  
  171.         if (!(options & FRM_DMUSTSELECT)) {
  172.             dialtree[DIALPBXB+numobs].ob_flags |= DEFAULT;
  173.         }
  174.     }
  175.  
  176. /*-------------------------------------------------------------------------
  177.  * Count the dialog strings, find the largest, calc the size of the
  178.  * dialog box and the placement of the buttons at the bottom.  If space
  179.  * permits, we leave a 1-line gutter between the last dialog string and
  180.  * the buttons, but if all 20 dialog strings are used, then the buttons
  181.  * are jammed right up against the bottom string.
  182.  *-----------------------------------------------------------------------*/
  183.  
  184.     {
  185.         register int btnadjust;
  186.  
  187.         numobs    = count_strings(pstrings, FRM_DSMAXSTRINGS, &slen);
  188.  
  189.         btnadjust = (numobs < FRM_DSMAXSTRINGS); /* button padding, if space allows */
  190.  
  191.         pixlen    = (slen + 2) * gl_wchar;
  192.         pixlen    = (pixlen > xbwidth) ? pixlen : xbwidth;
  193.  
  194.         sizechar  = gl_hchar;
  195.  
  196.         ptree            = dialtree;
  197.         ptree->ob_width  = pixlen;
  198.         ptree->ob_height = ((numobs + 3 + btnadjust) * sizechar);
  199.  
  200.